﻿using System;
using static System.Runtime.InteropServices.JavaScript.JSType;

namespace Lesson13_练习题
{
    class Program
    {
        #region 申明打印数组的方法
        static void PrintArray(int[] arr)
        {
            for (int i = 0; i < arr.Length; i++)
            {
                Console.Write(arr[i] + " ");
            }
            Console.WriteLine();
            return;
        }
        #endregion

        //★★★
        #region 练习二
        //写一个函数 实现一个数组的排序 并返回 并根据参数决定是升序还是降序
        static int[] Sort(int[] arr, bool isAscendingOrder)
        {
            bool order;
            for (int i = 0; i < arr.Length - 1; i++)
            {
                bool isSort = false;
                for (int j = 0; j < arr.Length - 1 - i; j++)
                {
                    //★
                    //使用一个三目运算符来判断升降序，节省代码量
                    order = isAscendingOrder ? arr[j] > arr[j + 1] : arr[j] < arr[j + 1];
                    if (order)
                    {
                        isSort = true;
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
                if (!isSort)
                {
                    break;
                }
            }
            return arr;
        }
        #endregion
        static void Main(string[] args)
        {
            #region 练习一
            //定义一个数组，长度为20，随机值0~100
            //使用冒泡排序分别进行 升序打印 和 降序打印
            //定义数组
            Random rand = new Random();
            int[] arr = new int[20];
            for (int i = 0; i < arr.Length; i++)
            {
                arr[i] = rand.Next(0, 101);
            }
            
            //升序排列
            for (int i = 0; i < arr.Length - 1; i++)
            {
                //申明标识
                bool isSort = false;
                for (int j = 0; j < arr.Length - 1 - i; j++)
                {
                    //两两比较
                    if (arr[j] > arr[j + 1])
                    {
                        //判断排序仍应继续
                        isSort = true;
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
                if (!isSort)
                {
                    break;
                }
            }
            //打印升序排列数组
            PrintArray(arr);

            //降序排列
            for(int i = 0; i < arr.Length -1; i++)
            {
                bool isSort = false;
                for (int j = 0; j < arr.Length - 1 - i; j++)
                {
                    if (arr[j] < arr[j + 1])
                    {
                        isSort = true;
                        int temp = arr[j];
                        arr[j] = arr[j + 1];
                        arr[j + 1] = temp;
                    }
                }
                if (!isSort)
                {
                    break;
                }
            }
            //打印
            PrintArray(arr);

            //升序与降序其实并无区别，只是一个将最大值排到最右边，一个将最小值排到最右边
            //因此写升序与降序时只需改变条件判断中的大于和小于号即可
            #endregion

            #region 练习二
            //写一个函数 实现一个数组的排序 并返回 并根据参数决定是升序还是降序
            //调用函数
            Sort(arr, true);
            PrintArray(arr);
            Sort(arr, false); 
            PrintArray(arr);
            #endregion
        }
    }
}